package com.haibara.codesandbox.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.retry.backoff.UniformRandomBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

@Configuration
public class KafkaRetryConfig {

    @Bean
    public RetryTemplate kafkaRetryTemplate() {
        RetryTemplate retryTemplate = new RetryTemplate();

        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(3); // 最大重试次数
        retryTemplate.setRetryPolicy(retryPolicy);

        // 退避时间指等待一段时间后再次重试
        // 这里设定的退避时间是 1000ms ~ 5000ms 之间
        // 在一个范围内随机的退避时间可以避免多客户端同时重试导致的拥塞问题。
        UniformRandomBackOffPolicy backOffPolicy = new UniformRandomBackOffPolicy();
        backOffPolicy.setMinBackOffPeriod(1000); // 最小退避时间，单位为毫秒
        backOffPolicy.setMaxBackOffPeriod(5000); // 最大退避时间，单位为毫秒
        retryTemplate.setBackOffPolicy(backOffPolicy);
        return retryTemplate;
    }
}
